﻿using System.ComponentModel;

namespace Common.Model
{
    /// <summary>
    /// 公共返回值对象。
    /// </summary>
    public class Result
    {
        /// <summary>
        /// 初始化默认的公共返回值对象。
        /// </summary>
        public Result()
        {
            this.Success = true;
        }

        /// <summary>
        /// 以指定的错误信息初始化公共返回值对象。
        /// </summary>
        /// <param name="error"></param>
        public Result(string error)
        {
            this.Msg = error;
        }

        /// <summary>
        /// 创建结果的一个浅表副本。
        /// </summary>
        /// <returns></returns>
        public Result Clone()
        {
            object value = this.MemberwiseClone();
            return value as Result;
        }

        /// <summary>
        /// 返回的错误信息。
        /// </summary>
        [Description("返回的错误信息")]
        public string Msg { get; set; }

        /// <summary>
        /// 返回的状态码
        /// </summary>
        [Description("返回的状态")]
        public bool Success { get; set; }
    }

    /// <summary>
    /// 携带指定类型参数的公共返回值对象。
    /// </summary>
    /// <typeparam name="T">指定返回值携带的参数类型。</typeparam>
    public class Result<T> : Result
    {
        /// <summary>
        /// 初始化默认的携带指定类型参数的公共返回值对象。
        /// </summary>
        public Result()
        {
            this.Success = true;
            this.Data = default(T);
        }

        /// <summary>
        /// 以指定的错误信息初始化携带指定类型参数的公共返回值对象。
        /// </summary>
        /// <param name="error"></param>
        public Result(string error)
            : base(error)
        {
            this.Msg = error;
            this.Success = false;
            this.Data = default(T);
        }

        /// <summary>
        /// 创建结果的一个浅表副本。
        /// </summary>
        /// <returns></returns>
        public new Result<T> Clone()
        {
            object value = this.MemberwiseClone();
            return value as Result<T>;
        }

        /// <summary>
        /// 返回值携带的参数。
        /// </summary>
        [Description("返回值")]
        public T Data { get; set; }
    }
}